By: Allyson Lynch
import csv
import urllib.request
import urllib.error
import urllib.parse
from rdkit import Chem
Check for error in the creation of the cleaned file of smiles
#check for errors
def check_name(name, return_type="smiles"):
"""takes an amine name and calls a smiles string from cactus"""
compliant_name = urllib.parse.quote_plus(name)
url = "https://cactus.nci.nih.gov/chemical/structure/"+name+"/"+return_type
req = urllib.request.Request(url)
try: resp = urllib.request.urlopen(req)
except urllib.error.URLError as e:
return None
resp = resp.read().decode(resp.headers.get_content_charset() or 'utf-8')
return resp
def error_files(file_name):
"""takes a file of amine names and returns files of amine names that could not be converted through cactus and rdkit"""
fh = open("Outputs/01x CCDC Clean Check/" + file_name, "r")
reader = csv.DictReader(fh, delimiter = '\t')
directory = "Outputs/01x CCDC Clean Check/"
oh = open(directory + "errors.tsv", "w")
error_file = csv.writer(oh, delimiter = '\t')
ok = open(directory + "passed.tsv", "w")
passed_file = csv.writer(ok, delimiter = '\t')
am = open(directory + "not_amine.tsv", "w")
amines_file = csv.writer(am, delimiter = '\t')
er = open(directory + "rdkit_errors.tsv", "w")
rdkit_file = csv.writer(er, delimiter = '\t')
ne = open(directory + "neutralization_errors.tsv", "w")
neutral_file = csv.writer(ne, delimiter = '\t')
ct = open(directory + "rdkit_to_cactus.tsv", "w")
cactus_file = csv.writer(ct, delimiter = '\t')
previously_found = []
duplicates_found = 0
for row in reader:
amines = eval(row['Amine'])
for name in amines:
if name not in previously_found:
smiles = check_name(name)
if smiles == None:
error_file.writerow(row.values())
else:
previously_found.append(name)
passed_file.writerow([name,smiles])
else: #name was previously found
duplicates_found += 1
if smiles!=None:
#neutralization check
amine = smiles.replace("[N-]", "[NH]")
amine = amine.replace("[n-]", "[nH]")
for salt in [".[Cl-]", ".[H+]", "[H+].", "[Cl-].", "H+", "H2+", "H3+"]: #clear salt and final neutralize
amine = amine.replace(salt, "")
amine = amine.replace("[N]", "N") #clean
amine = amine.replace("[n]", "n")
amine = check_name(amine)
if amine == None:
neutral_file.writerow([row.values(), smiles, amine])
#amine check
lower = smiles.lower()
alpha = ''.join(x for x in lower if x.isalpha())
for i in alpha:
if i!="n" and i!="h" and i!="c":
amines_file.writerow([row.values(), smiles])
#canonicalize check
mol = Chem.MolFromSmiles(smiles)
if mol==None:
rdkit_file.writerow([row.values(), smiles])
#cactus (part 2) check
else:
rd = Chem.MolToSmiles(mol)
check = check_name(rd)
if check == None:
cactus_file.writerow([row.values(), smiles, rd])
fh.close()
oh.close()
ok.close()
am.close()
er.close()
ne.close()
ct.close()
error_files("Amines_oxides.tsv")